~ 急急忙忙搞定 Docker 概念~
Docker containers vs virtual machines. Source: Wikipedia
相關程式碼:https://github.com/slindevel/modern-aws-marathon
對於資訊從業人員來說,如果是稍微熱衷技術的,肯定會把 Docker 作為開發最重要的工具之一,不過還是有不在少數一群人,對於 Docker 還是停留在只聽聞過的階段,希望通過一天的解說可以讓更多人享受到這個工具的便利。
我們說因為電腦科技演進,虛擬機技術可以在一台電腦上啟動多個作業系統(OS,Operating System),不過不論是啟動 Windows 或是 Linux 都需要一定的時間(~ 3min),虛擬化技術的目的是可以利用閒置的資源執行任務,以節省成本同時也方便管理,現在如果我們每一台虛擬機都是啟動 Linux 系統,那是不是有很多重複的部分需要被載入好幾次呢?Docker 就是將這些共用層統一管理的技術,把共用的部分統一管理,不同的部分獨立開來,切出一個個獨立的應用程式的獨立檔案空間以及執行環境這個獨立的執行空間我們稱做「容器」(Container),對應到一個個的虛擬機(VM,Virtual Machine),Docker 技術可以做到執行 Container 程式 與 在 Host OS 執行程式的效能相差無幾,且讓我們更易於管理複雜的應用程式環境了,有助於整體效率的提升。
Docker 包括三個基本概念
映像檔(Image) - 映像檔是一個唯讀的模板,映像檔可以用來建立容器。
容器(Container) - 容器執行應用。映像檔是唯讀的,容器在啟動的時候建立一層可寫層作為最上層。
倉庫(Repository) - 倉庫是集中存放映像檔檔案的場所。
我們直接通過幾個指令感受一下 Docker 的基本概念吧
$ docker -v
Docker version 20.10.24, build 297e128
docker pull
把它抓取下來,接著使用 docker images
查詢# Day11/docer_search.sh
$ ./docker_search.sh ubuntu | grep 22.04
ubuntu:22.04
$ docker pull ubuntu:22.04
$ docker images| grep ubuntu
ubuntu 22.04 6a47e077731f 2 weeks ago 69.2MB
$ docker run -it ubuntu:22.04 /bin/bash
root@08e6df1bba9b:/# pwd
/
root@08e6df1bba9b:/# ls
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
$ docker run -itd ubuntu:22.04 /bin/bash
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fd0e6cbefcea ubuntu:22.04 "/bin/bash" 26 seconds ago Up 24 seconds ecstatic_fermat
$ docker stop fd0e6cbefcea
fd0e6cbefcea
$ docker container rm fd0e6cbefcea
$ docker container prune
$ docker ps -a | grep ubuntu:22.04
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker rmi ubuntu:22.04
Dockerfile 是一個用來建構映像檔的文件,內容遵照既定的格式撰寫,包含了一行行指令以及註解
一個簡單的 python Dockerfile,其中 main.py 是一個 Flask 應用程式,會監聽 8888 port 並回應 Dockerized Marathon 訊息,需要檔案結構如下:
Day9
.
├── Dockerfile
├── docker_search.sh
├── main.py
└── requirements.txt
# Day11/Dockerfile
FROM python:3.7-alpine
WORKDIR /app
ADD . /app
RUN pip install -r requirements.txt
CMD python main.py
使用指令 docker build --platform=linux/amd64 -t marathon-dockerfile:latest . 建構,
注意這邊使用了--platform=linux/amd64 是因為筆者是使用 M1 Macbook docker預設指令會帶入
--platform=linux/arm64 很多 docker hub 上的 image 不支援會抓不到 image,習慣上 docker build、docker run 都會加上這個參數。
然後使用指令跑起來,在瀏覽器上打 http://127.0.0.1 就可以看到訊息了
$ docker run -d -p 80:8888 \
--platform=linux/amd64 \
--name marathon-container marathon-dockerfile
Docker 的概念至關重要,往後幾天會常常用到這些指令 & Dockerfile
今天簡單地帶可能還是新手的人可以很快上手 & 一起感受一下這個工具的強大
https://www.guru99.com/docker-tutorial.html
https://docker-curriculum.com/#introduction
https://www.sitecore.com/knowledge-center/getting-started/docker-a-quick-overview
https://www.freecodecamp.org/news/a-beginner-friendly-introduction-to-containers-vms-and-docker-79a9e3e119b/